const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g
// 处理style
function genProps(props) {
  let str = ''
  for (let i = 0; i < props.length; i++) {
    let attr = props[i]
    if (attr.name === 'style') {
      let obj = {}
      attr.value.split(';').forEach(item => {
        let [key, val] = item.split(':');
        obj[key] = val
      });
      attr.value = obj 
    }
    // if(i + 1 === props.length){
    //   str += `${attr.name}:${JSON.stringify(attr.value)},`
    // }else{
    //   str += `${attr.name}:${JSON.stringify(attr.value)}`
    // }
    str += `${attr.name}:${JSON.stringify(attr.value)},`
  }
  return `{${str.slice(0,-1)}}`
}
// 处理子节点
function genChildren(el) {
  let childen = el.children
  if (childen) {
    return childen.map(child => gen(child)).join(',')
  }
}
// 处理子节点逻辑
// 1 是元素 3是文本
function gen(node) {
  if (node.type === 1) {
    return generate(node)
  } else {
    //处理文本分为普通文本和插值表达式( {{}} )
    let text = node.text
    // 检查内容是否有插值表达式
    if (!defaultTagRE.test(text)) {
      return `_v(${JSON.stringify(text)})`
    } else {
      const tokens = []
      // defaultTagRE会改变值每次都要给他设置为0
      let lastIndex = defaultTagRE.lastIndex = 0
      let match, index, tokenValue 
      while (match = defaultTagRE.exec(text)) {
        index = match.index
        if (index > lastIndex) {
          tokenValue = text.slice(lastIndex, index)
          // console.log('[ 12 ] >', JSON.stringify(tokenValue))
          tokens.push(JSON.stringify(tokenValue))
        }
        // tag token
        const exp = match[1].trim()
        tokens.push(`_s(${exp})`)
        lastIndex = index + match[0].length
        if (lastIndex < text.length) {
          tokenValue = text.slice(lastIndex)
          // console.log('[ 34 ] >', tokenValue)
          // tokens.push(JSON.stringify(tokenValue))
        }
      }
      // console.log('[ tokens ] >', tokens)
      return `_v(${tokens.join('+')})`
    }
  }
}
export function generate(el) {
  let childen = genChildren(el)
  let code = `_c('${el.tag}',${el.attrs.length ? `${genProps(el.attrs)}` : 'undefined'} ${childen ? `,${childen}` : ''})`
  return code
} 